﻿namespace StockSharp.Algo.Indicators.Trend
{
	using System.ComponentModel;
	using System.Linq;

	/// <summary>
	/// Взвешанная скользящая средняя.
	/// </summary>
	[DisplayName("WMA")]
	[Description("Взвешанная скользящая средняя.")]
	public class WeightedMovingAverage : LengthIndicator<decimal>
	{
		private decimal _denominator;

		/// <summary>
		/// Создать <see cref="WeightedMovingAverage"/>.
		/// </summary>
		public WeightedMovingAverage()
			: base(typeof(decimal))
		{
		}

		/// <summary>
		/// Сбросить состояние индикатора на первоначальное. Метод вызывается каждый раз, когда меняются первоначальные настройки (например, длина периода).
		/// </summary>
		public override void Reset()
		{
			base.Reset();

			_denominator = 0;

			for (var i = 1; i <= Length; i++)
				_denominator += i;
		}

		/// <summary>
		/// Обработать входное значение.
		/// </summary>
		/// <param name="input">Входное значение.</param>
		/// <returns>Результирующее значение.</returns>
		protected override decimal OnProcess(IIndicatorValue input)
		{
			if (IsFormed)
			{
				Buffer.RemoveAt(0);
			}

			Buffer.Add(input.GetValue<decimal>());

			var w = 1;
			return Buffer.Sum(v => w++ * v) / _denominator;
		}
	}
}